package com.pc_project.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Calendar;
import java.util.Date;
import java.util.UUID;

public class TokenUtils {
    //    签发者
    private static final String issuer = "tcianna";
    //默认有效期为(小时为单位)
    private static final Integer extime = 1;

    //设置秘钥明文
    public static final String JWT_KEY = "miyao";


    //    设置唯一识别码
    public static String getUUID() {
//        UUID一般是像这样73a1e224-64c0-4b5c-851f-0b393b6d7686带有-，这里将所有的-都转化为空字符串
        String token = UUID.randomUUID().toString().replaceAll("-", "");
        return token;
    }

    //    得到生成token的builder
    private static JWTCreator.Builder getJwtBuilder(String subject, Integer ttlMillis, String uuid) {
        //        设置过期时间
        Integer ex=ttlMillis;
//        如果没有传进来值，那么我们就把默认值给他。
        if (ttlMillis == null) {
            ex = extime;
        }
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.HOUR, ex);
        Date date = instance.getTime();
//        设置签发的现在时间
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
//        将builder对象返回
        return JWT.create()
                .withExpiresAt(date) //过期时间
                .withKeyId(getUUID())//设置唯一的id（还有一个jwtid不知道和keyid什么关系。）
                .withSubject(subject)//主体，可以是json数据
                .withIssuer(issuer)//签发者
                .withIssuedAt(now)//签发时间
                ;
    }




    //创建token,利用HMAC256加密方式加密
    public static String createToken(String id,Integer ttlMillis, String subject) {
        return getJwtBuilder(subject, ttlMillis, id).sign(Algorithm.HMAC256(JWT_KEY));
    }
    public static String createToken(Integer ttlMillis, String subject) {
        return getJwtBuilder(subject, ttlMillis,getUUID()).sign(Algorithm.HMAC256(JWT_KEY));
    }
    public static String createToken( String subject) {
        return getJwtBuilder(subject, null,getUUID()).sign(Algorithm.HMAC256(JWT_KEY));
    }


//    解析token
    public static DecodedJWT parseJWT(String token){
//        创建验证对象
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(JWT_KEY)).build();//根据加密时的算法解析数据
        DecodedJWT verify = verifier.verify(token);
        return verify;
    }



}
